#include<cmath>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#define re register int
using namespace std;
inline int read(){
	int x=0,w=1;
	char ch=getchar();
	while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
	if(ch=='-') w=-1,ch=getchar();
	while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-48,ch=getchar();
	return x*w;
}
struct edge {
    int to,next;
    bool w;
}e[400010];
int head[200010],tot,dp[200010];
inline void add(int from,int to,bool w) {
    e[++tot]=(edge){to,head[from],w};
    head[from]=tot;
}
void dfs1(int u,int fa) {				//求u到子节点需要逆转的边数
    for(int i=head[u];i;i=e[i].next) {
    	int v=e[i].to;
        if(v==fa) continue;
        dfs1(v,u);
        dp[u]+=dp[v]+e[i].w;
    }
}
void dfs2(int u,int fa) {				//求u到全树需要逆转的边数
    for (int i=head[u];i;i=e[i].next) {
    	int v=e[i].to;
        if (v==fa) continue;
        dp[v]=dp[u]+(e[i].w?-1:1);
        dfs2(v,u);
    }
}
int main() {
    int n,a,b;
    while (scanf("%d",&n)!=EOF) {
        tot=0;
        memset(head,0,sizeof(head));
        for (int i=1;i<=n-1;i++) {
            a=read(),b=read();
            add(a,b,0);
            add(b,a,1);
        }
        memset(dp,0,sizeof(dp));
        dfs1(1,-1);dfs2(1,-1);
        int Min=99999999;
        for (int i=1;i<=n;i++) if (Min>dp[i]) Min=dp[i];
        printf("%d\n",Min);
        for (int i=1;i<=n;i++) if (Min==dp[i]) printf("%d ",i);
        printf("\n");
    }
    return 0;
}
